/**
 * 请求模块 :封装 axios
 */

import axios from 'axios'
import JSONbig from 'json-bigint'
// 《使用拦截器统一添加 token》2. 加载容器
// 在非组件模块中访问 Vuex 容器，那就谁用谁就直接加载
// 这里加载得到的 store 和组件中的 $store 是一个东西
import store from '@/store'
const request = axios.create({
  baseURL: 'http://ttapi.research.itcast.cn/'
})

request.defaults.transformResponse = [function (data) {
  //   return data ? JSONbig.parse(data) : {}
  try {
    // data 数据可能不是标准的 JSON 格式字符串，否则会导致 JSONbig.parse(data) 转换失败报错
    return JSONbig.parse(data)
  } catch (err) {
    // 无法转换的数据直接原样返回
    return data
  }
}]

/**
 * 请求拦截器
 * 使用拦截器统一添加 token
 */
// 《使用拦截器统一添加 token》1. 添加拦截器
// 注意：为 request 添加拦截器
request.interceptors.request.use(function (config) {
  // console.log('烂机器')
  // Do something before request is sent

  // 统一在请求头中添加 token，名字，数据
  // // 《使用拦截器统一添加 token》3. 添加 token
  const { user } = store.state
  if (user) {
    config.headers.Authorization = `Bearer ${user.token}`
  }
  return config
}, function (error) {
  // Do something with request error
  return Promise.reject(error)
})

/**
 * 响应拦截器
 */
request.interceptors.response.use(function (response) {
  // Any status code that lie within the range of 2xx cause this function to trigger
  // Do something with response data
  return response
}, function (error) {
  // Any status codes that falls outside the range of 2xx cause this function to trigger
  // Do something with response error
  return Promise.reject(error)
})

// 导出请求对象
export default request
